package main

import "fmt"

func main() {

	// 删除开头的元素可以直接移动数据指针
	a := []int{1, 2, 3}
	a = a[1:]
	fmt.Println(a)
	//  append 原地完成
	a = []int{1, 2, 3}
	a = append(a[:0], a[1:]...)
	fmt.Println(a)
	// copy() 函数来删除开头
	a = []int{1, 2, 3}
	a = a[:copy(a, a[1:])] // 删除开头1个元素
	fmt.Println(a)

	// 从中间位置删除
	// 对于删除中间的元素，需要对剩余的元素进行一次整体挪动，同样可以用 append 或 copy 原地完成：
	a = []int{1, 2, 3, 4, 5}
	// 使用 append 删除索引为 2 的元素
	a = append(a[:2], a[3:]...)
	fmt.Println(a)
	// 使用 copy 删除索引为 2 的元素
	a = []int{1, 2, 3, 4, 5}
	a = a[:copy(a[2:], a[3:])]
	fmt.Println(a)

	// 删除末尾元素
	a = []int{1, 2, 3}
	a = a[:len(a)-1]
	fmt.Println(a)
}

// 你没有改底层数组的指针，只是改了切片“怎么看”这个数组的方式而已
// 所以删除元素后，底层数组的容量是不变的
// 如果想要真正释放被删除元素占用的内存，可以把切片重新分配一个新的底层数组
// 例如：a = append([]int{}, a...)
// 这样就会把 a 切片的所有元素都复制到一个新的底层数组中，然后把 a 指向这个新的底层数组

// Go 切片删除元素，
// 不是“把纸撕了”，
// 而是“把纸折起来，让你看不见”。
